接下來加入的是鏈接功能,也就是 then
要可以:
p
,p
會以 onFulfilled
或 onRejected
回傳的值 resolve。onFulfilled
或 onRejected
,就把它們本來會接到的值傳給 p
。這是改變後的 then
方法:
then(onFulfilled, onRejected) {
const returnValue = new Promise(); // (A)
const self = this;
let fulfilledTask;
if (typeof onFulfilled === 'function') {
fulfilledTask = function () {
const r = onFulfilled(self.promiseResult);
returnValue.resolve(r); // (B)
};
} else {
fulfilledTask = function () {
returnValue.resolve(self.promiseResult); // (C)
};
}
let rejectedTask;
if (typeof onRejected === 'function') {
rejectedTask = function () {
const r = onRejected(self.promiseResult);
returnValue.resolve(r); // (D)
};
} else {
rejectedTask = function () {
returnValue.reject(self.promiseResult); // (E)
};
}
···
return returnValue; // (F)
}
首先,then
會建立和回傳一個新的 promise (A、F)。另外,原本的成功或失敗的處理只是執行 onFulfilled(result) 或 onRejected(result),現在改成
onFulfilled(result)
的結果 (B)。或在缺少 onFulfilled
時,直接傳出成功結果 (C)。onRejected(result)
的結果 (D,另外特別注意這裡也是 resolve 不是 reject)。或在缺少 onRejected
時,直接傳出失敗結果 (E)。